package main

import (
	"fmt"
)

//字符串 "" `跨行+特殊符号输入`
/* func main() {
	var str1 string = "hello world"
	fmt.Printf("str1: %v\n", str1)
	var str2 string = `\c:\code
	\lalall
	.\ccc`
	fmt.Printf("str2: %v\n", str2)
} */

//字符串连接 +
/* func main() {
	name := "sky"
	age := "20"
	msg := name + " " + age
	fmt.Printf("msg:%v\n", msg)
	fmt.Println("----------")
	msg = ""
	msg += name
	msg += " "
	msg += age
	fmt.Printf("msg: %v\n", msg)
} */

//使用fmt.Sprintf()函数
/* func main() {
	name1 := "tom"
	age1 := "3"
	msg1 := fmt.Sprintf("%s,%s", name1, age1)
	fmt.Printf("msg1: %v\n", msg1)
} */

// 使用strings.Join()
//join会先根据字符串数组的内容，计算出一个拼接之后的长度，然后申请对应大小的内存，
//一个一个字符串填入，在已有一个数组的情况下，这种效率会很高，
//但是本来没有，去构造这个数据的代价也不小
/* func main() {
	name := "sky"
	age := "18"
	msg := strings.Join([]string{name, age}, ",")
	fmt.Printf("msg:%v\n", msg) //msg:sky,18
} */

// buffer.WriteString()函数
//这个比较理想，可以当成可变字符使用，对内存的增长也有优化，
//如果能预估字符串的长度，还可以用 buffer.Grow() 接口来设置 capacity
/* func main() {
	var buffer bytes.Buffer
	buffer.WriteString("sky")
	buffer.WriteString(",")
	buffer.WriteString("20")
	fmt.Printf("buffer.String(): %v\n", buffer.String())
}
*/

// 转义字符
/* func main() {
	fmt.Print("hello\tworld\n") //hello   world
	fmt.Print("\"c:\\test\\\"") //"c:\test\"
}
*/

// 字符串切片 前闭后开
/* func main() {
	str := "Hello world"
	n := 3
	m := 5
	fmt.Println(str[n])   //获取字符串索引位置为n的原始字节 - 108 l的ascii码值
	fmt.Println(str[n:m]) //截取得字符串索引位置为 n 到 m-1 的字符串
	fmt.Println(str[n:])  //截取得字符串索引位置为 n 到 len(s)-1 的字符串
	fmt.Println(str[:m])  //截取得字符串索引位置为 0 到 m-1 的字符串
}
*/

// 字符串常用函数
/* func main() {
	s := "hello world！"
	fmt.Printf("len(s): %v\n", len(s)) //求长度
	fmt.Printf("strings.Split(s, \"\"): %v\n", strings.Split(s, " ")) //分割
	fmt.Printf("strings.Contains(s, \"hello\"): %v\n", strings.Contains(s, "hello")) //判断是否包含
	fmt.Printf("strings.HasPrefix(s, \"hello\"): %v\n", strings.HasPrefix(s, "hello")) //前缀判断
	fmt.Printf("strings.HasSuffix(s, \"world！\"): %v\n", strings.HasSuffix(s, "world！")) //后缀判断
	fmt.Printf("strings.Index(s, \"l\"): %v\n", strings.Index(s, "l")) //子串出现位置
	fmt.Printf("strings.LastIndex(s, \"l\"): %v\n", strings.LastIndex(s, "l")) //子串最后出现位置
} */

// byte 和rune类型
func main() {
	a := '胖'
	fmt.Printf("a: %v,%c\n", a, a) //32982,胖 - rune代表一个UTF-8字符 实际为int32
	b := 'a'
	fmt.Printf("b: %v,%c\n", b, b) //97,a

}
